package com.bt.lms.ui.page.sys.role.action;

import com.bt.lms.entity.page.Page;
import com.bt.lms.ui.page.sys.utils.NetWorkUtils;
import com.bt.lms.ui.page.sys.vo.RoleInfoVo;
import com.bt.lms.ui.page.sys.vo.RoleTableViewVo;
import com.bt.lms.ui.vo.PageSkipInfo;
import com.bt.lms.network.msg.ReqMsg;
import com.bt.lms.ui.page.sys.ServerInfo;
import com.bt.lms.ui.page.sys.utils.Encode;
import com.bt.lms.ui.page.sys.role.PageAdd;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.control.Alert;
import javafx.scene.control.TextArea;
import javafx.scene.control.TextField;
import javafx.scene.layout.Pane;

import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;

/**
 * 保存按钮事件（编辑角色界面）
 */
public class RCSaveBtnAction implements EventHandler<ActionEvent> {

    /**
     * 界面跳转信息
     */
    private final PageSkipInfo pageSkipInfo;

    /**
     * 要编辑的角色信息
     */
    private final RoleTableViewVo roleTableViewVo;

    /**
     * 构建事件
     *
     * @param pageSkipInfo    界面跳转信息
     * @param roleTableViewVo 要编辑的角色信息
     */
    public RCSaveBtnAction(PageSkipInfo pageSkipInfo, RoleTableViewVo roleTableViewVo) {
        this.pageSkipInfo = pageSkipInfo;
        this.roleTableViewVo = roleTableViewVo;
    }

    /**
     * 验证
     *
     * @param event the event which occurred
     */
    @Override
    public void handle(ActionEvent event) {

        //1.获取用户输入
        RoleInfoVo roleInfoVo = getInPut();
        //2.验证用户输入
        String hint = verifyInPut(roleInfoVo);
        //3.组装网络消息包
        if (hint == null) {
            ReqMsg reqMsg = Encode.encodeToMsg(roleInfoVo, (short) 6104);
            byte[] bytes = reqMsg.toBytes();
            //4.组网
            Socket socket = packageNet();
            //5.发送
            boolean b = sendMesNet(socket, bytes);

            if (b)
                succeed();//成功方法
            else
                fail("保存失败，请稍候重试。"); //失败提示
        } else {
            fail(hint); //失败提示
        }
    }

    /**
     * 发送网络消息包
     *
     * @param socket 网
     * @param bytes  要发送的byte数组
     * @return 发送结果
     */
    private boolean sendMesNet(Socket socket, byte[] bytes) {


        //发送网络
        try {
            OutputStream outputStream = socket.getOutputStream();
            outputStream.write(bytes);
            outputStream.flush();
            //关闭资源
            outputStream.close();
            socket.close();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        return true;

    }

    /**
     * 组网
     *
     * @return 网
     */
    private Socket packageNet() {
        String ip = ServerInfo.IP;
        int port = ServerInfo.PORT;

        Socket socket;
        try {
            socket = new Socket(ip, port);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

        return socket;
    }

    /**
     * 结束方法（弹窗提示）
     *
     * @param hint 提示内容
     */
    private void fail(String hint) {

        Alert alert = new Alert(Alert.AlertType.WARNING);
        alert.setTitle("失败");
        alert.setHeaderText(null);
        alert.setContentText(hint);
        alert.showAndWait();

    }

    /**
     * 验证用户输入
     *
     * @param roleInfoVo 用户输入
     * @return 验证结果
     */
    private String verifyInPut(RoleInfoVo roleInfoVo) {

        //验证提示文本
        String hint = "";

        //角色名称 必填 文本 5-15
        String name = roleInfoVo.getName();
        if ("".equals(name)) {
            hint += "名称未填，请输入名称。\n\t";
        } else {
            int nameLen = name.length();
            if (!(nameLen >= 5 && nameLen <= 15))
                hint += "名称长度不合适，请输入5-15位中文、字母、数字。\n\t";
        }

        //角色说明 非必填 文本 中
        String state = roleInfoVo.getDetails();
        if (!"".equals(state)) {
            //用户填写了才判断
            int stateLen = state.length();
            if (stateLen > 255)
                hint += "角色说明过长，最大255。\n\t";
        }

        return "".equals(hint) ? null : hint;
    }

    /**
     * 获取用户输入
     *
     * @return 用户输入
     */
    private RoleInfoVo getInPut() {
        //创建用户输入
        RoleInfoVo roleInfoVo = new RoleInfoVo();

        //界面容器
        Pane pane = pageSkipInfo.getPane();
        //获取名称
        TextField nameTF = (TextField) pane.lookup("#" + PageAdd.NAME_TF);
        String name = nameTF.getText().trim();
        roleInfoVo.setName(name);
        //获取角色说明
        TextArea stateTA = (TextArea) pane.lookup("#" + PageAdd.STATE_TA);
        String detailsStr = stateTA.getText();
        if (detailsStr!=null){
            String details = detailsStr.trim();
            roleInfoVo.setDetails(details);
        }else {
            roleInfoVo.setDetails("");
        }
        //维护id
        Long id = roleTableViewVo.getId();
        roleInfoVo.setId(id);

        return roleInfoVo;
    }

    /**
     * 保存成功方法
     */
    private void succeed() {

        Alert alert = new Alert(Alert.AlertType.INFORMATION);
        alert.setTitle("成功");//头部提示
        alert.setHeaderText(null);//清除固有提示
        alert.setContentText("保存成功");//提示文本
        alert.showAndWait();//显示
        //界面跳转
        NetWorkUtils.reqRolePagingPage(pageSkipInfo,new Page<>());

    }

}
